Accept remotes without `fetch` option on primary The primary replication node only uses `apiUrl` to communicate with secondary nodes. This means that remote confiugrations without the `url` and `fetch` options should be valid. The `remote.<name>.url` is already considered not-required option on the primary. With this change, the remote configurations on the primary node without `fetch` option will also be considered valid. Bug: Issue 40015281 Change-Id: I701dd82481b28b9a051f97b2a461ebf9b96b0025 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/SourceConfigParser.java b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/SourceConfigParser.java index d7ae063..67ac6f1 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/pull/SourceConfigParser.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/pull/SourceConfigParser.java 
@@ -79,14 +79,14 @@  return sourceConfigs.build();  }   - private static List<RemoteConfig> allFetchRemotes(Config cfg) throws ConfigInvalidException { + private List<RemoteConfig> allFetchRemotes(Config cfg) throws ConfigInvalidException {    Set<String> names = cfg.getSubsections("remote");  List<RemoteConfig> result = Lists.newArrayListWithCapacity(names.size());  for (String name : names) {  try {  final RemoteConfig remoteConfig = new RemoteConfig(cfg, name); - if (!remoteConfig.getFetchRefSpecs().isEmpty()) { + if (!isReplica || !remoteConfig.getFetchRefSpecs().isEmpty()) {  result.add(remoteConfig);  } else {  logger.atFine().log( 
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md index 99d8b78..a934dfb 100644 --- a/src/main/resources/Documentation/config.md +++ b/src/main/resources/Documentation/config.md 
@@ -439,6 +439,10 @@ 	when `replicatePermissions` is true, even if the push refspec 	is 'all refs'.   +> NOTE: When using the pull-replication and replication plugins together, +> **NOT having** a `fetch` configuration for a remote, will also enable +> the standard _push_ replication for that remote. +  [2]: #example_file    remote.NAME.timeout